mod common;
use crate::common::*;
use crate::tech::{ck_tech, tech_data};
use base::base::VMap;
use serde_json::json;

/*  1. no any data
 *  2. add one tech
 *  3. get all tech
 *  4. get the added tech item
 *  5. rm the tech item
 *  6. get all tech
 *  7. get the removed tech item
 *  8. rm the tech item again
 */
#[tokio::test]
async fn test_tech_1() {
    let val = tech_data();

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "sn": "",
                "name": "name_te1",
            }
        }),
        "tech",
        "add",
        e_miss("sn"),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "name": "name_te1",
            }
        }),
        "tech",
        "add",
        e_miss("sn"),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
        }),
        "tech",
        "list",
        e_node(),
    )
    .await;

    ck_tech(pos!(), json!({})).await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "sn": "te1",
                "name": "name_te1",
            }
        }),
        "tech",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
        }),
        "tech",
        "list",
        json!([val.ck_val("te1").unwrap()]),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "get",
        val.ck_val("te1").unwrap().clone(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "rm",
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
        }),
        "tech",
        "list",
        e_node(),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "get",
        e_node(),
    )
    .await;

    ck_tech(pos!(), json!({})).await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "rm",
    )
    .await;

    ck_tech(pos!(), json!({})).await;
}

/*  1. add two tech
 *  2. get all tech
 *  3. modify one tech
 *  4. get all tech
 *  5. get modified tech
 *  6. remove the modified tech, can't be remove
 *  7. modify one tech
 *  8. remove the modified tech
 *  9. remove the other tech
 *  10. get all tech
 */
#[tokio::test]
async fn test_tech_2() {
    let val = tech_data();

    ok(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "sn": "te1",
                "name": "name_te1",
            }
        }),
        "tech",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "sn": "te2",
                "name": "name_te2",
            }
        }),
        "tech",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "te2": val.ck_val("te2").unwrap(),
        }),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
        }),
        "tech",
        "list",
        json!([val.ck_val("te1").unwrap(), val.ck_val("te2").unwrap(),]),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "v": [{
                "sn": "te1",
                "name": "n_te1",
                "task": 1,
            }]
        }),
        "tech",
        "md",
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
        }),
        "tech",
        "list",
        json!([val.ck_val("c_te1").unwrap(), val.ck_val("te2").unwrap(),]),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "get",
        val.ck_val("c_te1").unwrap().clone(),
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year").unwrap(),
            "te1": val.ck_val("c_te1").unwrap(),
            "te2": val.ck_val("te2").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "rm",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_2").unwrap(),
            "te2": val.ck_val("te2").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te2",
        }),
        "tech",
        "rm",
    )
    .await;

    ck_tech(pos!(), json!({})).await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
        }),
        "tech",
        "list",
        e_node(),
    )
    .await;
}

/*  1. add one tech
 *  2. get esop
 *  3. remove esop
 *  4. modify esop
 *  5. get esop
 *  6. rm esop
 *  7. get esop
 *  8. rm esop again
 *  9. modify esop
 *  10. get esop
 *  11. rm tech
 *  12. get esop
 *  13. get tech
 */
#[tokio::test]
async fn test_tech_3() {
    let val = tech_data();

    ok(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "sn": "te1",
                "name": "name_te1",
            }
        }),
        "tech",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "esop",
        "list",
        e_node(),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "esop",
        "get",
        e_node(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "esop",
        "rmall",
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "esop",
        "rm",
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "v": val.ck_val("esop").unwrap()
        }),
        "esop",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "esop": val.ck_val("wsn").unwrap(),
            "esop_1": val.ck_val("esop").unwrap().ck_val("M010").unwrap(),
            "esop_2": val.ck_val("esop").unwrap().ck_val("M020").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "esop",
        "rmall",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "v": val.ck_val("esop").unwrap()
        }),
        "esop",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "esop": val.ck_val("wsn").unwrap(),
            "esop_1": val.ck_val("esop").unwrap().ck_val("M010").unwrap(),
            "esop_2": val.ck_val("esop").unwrap().ck_val("M020").unwrap(),
        }),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "esop",
        "list",
        val.ck_val("esop").unwrap().clone(),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "esop",
        "get",
        val.ck_val("esop").unwrap().ck_val("M010").unwrap().clone(),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M020",
        }),
        "esop",
        "get",
        val.ck_val("esop").unwrap().ck_val("M020").unwrap().clone(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "esop",
        "rm",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "esop": val.ck_val("wsn_2").unwrap(),
            "esop_2": val.ck_val("esop").unwrap().ck_val("M020").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M020",
        }),
        "esop",
        "rm",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "esop",
        "get",
        e_node(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "esop",
        "rmall",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
            "v": val.ck_val("esop").unwrap().ck_val("M010").unwrap(),
        }),
        "esop",
        "md",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "esop": val.ck_val("wsn_1").unwrap(),
            "esop_1": val.ck_val("esop").unwrap().ck_val("M010").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
            "v": val.ck_val("esop_c").unwrap().ck_val("M010").unwrap(),
        }),
        "esop",
        "md",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "esop": val.ck_val("wsn_1").unwrap(),
            "esop_1": val.ck_val("esop_c").unwrap().ck_val("M010").unwrap(),
        }),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "esop",
        "list",
        json!({"M010": val.ck_val("esop_c").unwrap().ck_val("M010").unwrap().clone()}),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M020",
            "v": val.ck_val("esop_c").unwrap().ck_val("M020").unwrap().clone(),
        }),
        "esop",
        "md",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "esop": val.ck_val("wsn").unwrap(),
            "esop_1": val.ck_val("esop_c").unwrap().ck_val("M010").unwrap(),
            "esop_2": val.ck_val("esop_c").unwrap().ck_val("M020").unwrap(),
        }),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "esop",
        "list",
        val.ck_val("esop_c").unwrap().clone(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "rm",
    )
    .await;

    ck_tech(pos!(), json!({})).await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "esop",
        "list",
        e_node(),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "get",
        e_node(),
    )
    .await;
}

/*  1. add one tech
 *  2. get bom
 *  3. remove bom
 *  4. modify bom
 *  5. get bom
 *  6. rm bom
 *  7. get bom
 *  8. rm bom again
 *  9. modify bom
 *  10. get bom
 *  11. rm tech
 *  12. get bom
 *  13. get tech
 */
#[tokio::test]
async fn test_tech_4() {
    let val = tech_data();

    ok(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "sn": "te1",
                "name": "name_te1",
            }
        }),
        "tech",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "list",
        e_node(),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "bom",
        "get",
        e_node(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "rmall",
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "bom",
        "rm",
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "v": val.ck_val("bom").unwrap()
        }),
        "bom",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "bom": val.ck_val("wsn").unwrap(),
            "bom_1": val.ck_val("bom").unwrap().ck_val("M010").unwrap(),
            "bom_2": val.ck_val("bom").unwrap().ck_val("M020").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "rmall",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "v": val.ck_val("bom").unwrap()
        }),
        "bom",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "bom": val.ck_val("wsn").unwrap(),
            "bom_1": val.ck_val("bom").unwrap().ck_val("M010").unwrap(),
            "bom_2": val.ck_val("bom").unwrap().ck_val("M020").unwrap(),
        }),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "list",
        val.ck_val("bom").unwrap().clone(),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "bom",
        "get",
        val.ck_val("bom").unwrap().ck_val("M010").unwrap().clone(),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M020",
        }),
        "bom",
        "get",
        val.ck_val("bom").unwrap().ck_val("M020").unwrap().clone(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "bom",
        "rm",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "bom": val.ck_val("wsn_2").unwrap(),
            "bom_2": val.ck_val("bom").unwrap().ck_val("M020").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M020",
        }),
        "bom",
        "rm",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
        }),
        "bom",
        "get",
        e_node(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "rmall",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
            "v": val.ck_val("bom").unwrap().ck_val("M010").unwrap(),
        }),
        "bom",
        "md",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "bom": val.ck_val("wsn_1").unwrap(),
            "bom_1": val.ck_val("bom").unwrap().ck_val("M010").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M010",
            "v": val.ck_val("bom_c").unwrap().ck_val("M010").unwrap(),
        }),
        "bom",
        "md",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "bom": val.ck_val("wsn_1").unwrap(),
            "bom_1": val.ck_val("bom_c").unwrap().ck_val("M010").unwrap(),
        }),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "list",
        json!({"M010": val.ck_val("bom_c").unwrap().ck_val("M010").unwrap().clone()}),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "sn": "M020",
            "v": val.ck_val("bom_c").unwrap().ck_val("M020").unwrap().clone(),
        }),
        "bom",
        "md",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "bom": val.ck_val("wsn").unwrap(),
            "bom_1": val.ck_val("bom_c").unwrap().ck_val("M010").unwrap(),
            "bom_2": val.ck_val("bom_c").unwrap().ck_val("M020").unwrap(),
        }),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "list",
        val.ck_val("bom_c").unwrap().clone(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "rm",
    )
    .await;

    ck_tech(pos!(), json!({})).await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "list",
        e_node(),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "get",
        e_node(),
    )
    .await;
}

/*  1. add one tech
 *  2. modify bom
 *  3. modify esop
 *  4. get bom
 *  5. get esop
 *  6. rm tech
 *  7. get tech
 *  8. get bom
 *  9. get esop
 */
#[tokio::test]
async fn test_tech_5() {
    let val = tech_data();

    ok(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "sn": "te1",
                "name": "name_te1",
            }
        }),
        "tech",
        "add",
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "v": val.ck_val("bom").unwrap()
        }),
        "bom",
        "add",
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "list",
        val.ck_val("bom").unwrap().clone(),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
            "v": val.ck_val("esop").unwrap()
        }),
        "esop",
        "add",
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "esop",
        "list",
        val.ck_val("esop").unwrap().clone(),
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "bom": val.ck_val("wsn").unwrap(),
            "bom_1": val.ck_val("bom").unwrap().ck_val("M010").unwrap(),
            "bom_2": val.ck_val("bom").unwrap().ck_val("M020").unwrap(),
            "esop": val.ck_val("wsn").unwrap(),
            "esop_1": val.ck_val("esop").unwrap().ck_val("M010").unwrap(),
            "esop_2": val.ck_val("esop").unwrap().ck_val("M020").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "rm",
    )
    .await;

    ck_tech(pos!(), json!({})).await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "bom",
        "list",
        e_node(),
    )
    .await;

    do_ret(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "list",
        e_node(),
    )
    .await;
}

#[tokio::test]
async fn test_tech_6() {
    let val = tech_data();

    ok(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "sn": "te1",
                "name": "name_te1",
            }
        }),
        "tech",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_1").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "v": {
                "sn": "te2",
                "name": "name_te2",
            }
        }),
        "tech",
        "add",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year").unwrap(),
            "te1": val.ck_val("te1").unwrap(),
            "te2": val.ck_val("te2").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "ex": ["index"],
            "v": [
            {"sn": "te1", "name": "n_te1", "index": 1, "task": 1},
            {"sn": "te2", "name": "n_te2", "index": 2},
            ]
        }),
        "tech",
        "md",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year").unwrap(),
            "te1": val.ck_val("c_te1").unwrap(),
            "te2": val.ck_val("c_te2").unwrap(),
        }),
    )
    .await;

    ok_ret(
        pos!(),
        json!({
            "line": "1",
        }),
        "tech",
        "list",
        json!([val.ck_val("c_te1").unwrap(), val.ck_val("c_te2").unwrap()]),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te1",
        }),
        "tech",
        "rm",
    )
    .await;

    ck_tech(
        pos!(),
        json!({
            "all": val.ck_val("all").unwrap(),
            "year": val.ck_val("year_2").unwrap(),
            "te2": val.ck_val("c_te2").unwrap(),
        }),
    )
    .await;

    ok(
        pos!(),
        json!({
            "line": "1",
            "k": "te2",
        }),
        "tech",
        "rm",
    )
    .await;

    ck_tech(pos!(), json!({})).await;
}
